#

| Chapter 11 The Awk Scripting Language |

## 11.3 Patterns and Procedures

Awk scripts consist of patterns and procedures:

> `pattern` {`procedure`}

Both are optional. If `pattern` is missing, {`procedure`} is applied to all lines. If {`procedure`} is missing, the matched line is printed.

### 11.3.1 Patterns

A pattern can be any of the following:

> /`regular expression`/

> `relational expression`

> `pattern-matching expression`

> BEGIN

> END

- Expressions can be composed of quoted strings, numbers, operators, functions, defined variables, or any of the predefined variables described later under "Awk System Variables".

- Regular expressions use the extended set of metacharacters and are described in Section 6.

- In addition, ^ and $ can be used to refer to the beginning and end of a field, respectively, rather than the beginning and end of a line.

- Relational expressions use the relational operators listed under "Operators" later in this section. Comparisons can be either string or numeric. For example, $2 > $1 selects lines for which the second field is greater than the first.

- Pattern-matching expressions use the operators ~ (match) and !~ (don't match). See "Operators" later in this section.

- The BEGIN pattern lets you specify procedures that will take place `before` the first input line is processed. (Generally, you set global variables here.)

- The END pattern lets you specify procedures that will take place `after` the last input record is read.

Except for BEGIN and END, patterns can be combined with the Boolean operators || (or), && (and), and ! (not). A range of lines can also be specified using comma-separated patterns:

> `pattern`,`pattern`

### 11.3.2 Procedures

Procedures consist of one or more commands, functions, or variable assignments, separated by newlines or semicolons, and contained within curly braces. Commands fall into four groups:

- Variable or array assignments

- Printing commands

- Built-in functions

- Control-flow commands

### 11.3.3 Simple Pattern-Procedure Examples

1. Print first field of each line:

   >     { print $1 }

2. Print all lines that contain `pattern`:

   >     /pattern/

3. Print first field of lines that contain `pattern`:

   >     /pattern/{ print $1 }

4. Select records containing more than two fields:

   >     NF > 2

5. Interpret input records as a group of lines up to a blank line:

   >     BEGIN { FS = "\n"; RS = "" }

6. Print fields 2 and 3 in switched order, but only on lines whose first field matches the string "URGENT":

   >     $1 ~ /URGENT/ { print $3, $2 }

7. Count and print the number of `pattern` found:

   >     /pattern/ { ++x }
   >     END { print x }

8. Add numbers in second column and print total:

   >     {total += $2 };
   >     END { print "column total is", total}

9. Print lines that contain less than 20 characters:

   >     length < 20

10. Print each line that begins with `Name:` and that contains exactly seven fields:

    >     NF == 7 && /^Name:/

11. Reverse the order of fields:

    >     { for (i = NF; i >= 1; i-) print $i }

11.2 Conceptual Overview |  | 11.4 Awk System Variables